package com.ssy.lingxi.member.merchant.service.base;

import com.ssy.lingxi.common.model.dto.UserLoginCacheDTO;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.member.merchant.entity.MemberChannelDO;
import com.ssy.lingxi.member.merchant.entity.MemberRelationDO;
import com.ssy.lingxi.member.merchant.entity.RoleDO;
import com.ssy.lingxi.member.merchant.model.bo.WorkflowTaskListBO;
import com.ssy.lingxi.member.merchant.model.constant.MemberInnerStatusEnum;
import com.ssy.lingxi.member.merchant.model.vo.basic.request.AreaCodeVO;
import com.ssy.lingxi.member.merchant.model.vo.basic.response.*;
import com.ssy.lingxi.member.merchant.model.vo.platform.response.RoleRuleManageVO;
import com.ssy.lingxi.member.merchant.model.vo.validate.response.WorkFlowStepVO;

import java.util.List;

/**
 * 会员审核、资料入库基础服务接口
 * @author 万宁
 * @version 2.0.0
 * @date 2020-09-14
 */
public interface IBaseMemberValidateService {
    /**
     * 根据创建下级会员的规则，查询下级会员的会员类型列表
     * @param memberTypeEnum 上级会员的会员类型枚举
     * @return 查询结果
     */
    List<MemberTypeIdAndNameVO> getSubMemberTypeList(Integer memberTypeEnum);

    /**
     * 根据创建下级会员的规则，查询下级会员的会员类型列表(SASS)
     * @param memberTypeEnum 上级会员的会员类型枚举
     * @param roleManageVOList 会员适用角色list
     * @return 查询结果
     */
    List<MemberTypeIdAndNameVO> getSubMemberTypeList(Integer memberTypeEnum, List<RoleRuleManageVO> roleManageVOList);

    /**
     * 平台会员审核外部流程定义
     * @param roleName 角色名称
     * @return 步骤列表
     */
    List<WorkFlowStepVO> getPlatformValidateOuterSteps(String roleName);

    /**
     * 会员入库审核外部流程定义
     * @param relationDO 会员关系
     * @return 步骤列表
     */
    List<WorkFlowStepVO> getMemberDepositOuterSteps(MemberRelationDO relationDO);

    /**
     * 会员入库审核外部流程定义
     * @param roleName 上级角色名称
     * @param subRoleName 下级角色名称
     * @return 步骤列表
     */
    List<WorkFlowStepVO> getMemberDepositOuterSteps(String roleName, String subRoleName);

    /**
     * 会员变更审核外部流程定义
     * @param relationDO 会员关系
     * @return 步骤列表
     */
    List<WorkFlowStepVO> getMemberModifyOuterSteps(MemberRelationDO relationDO);

    /**
     * 添加角色时，检验角色是否符合规则定义
     * @param roleDO 被检验的角色
     * @param memberTypeEnum 会员类型枚举，定义在MemberTypeEnum和MemberTypeDO中
     * @return 检验结果
     */
    Wrapper<Void> checkRoleWithMemberType(RoleDO roleDO, Integer memberTypeEnum);

    /**
     * 查询当前流程的步骤定义
     * @param relationDO 会员关系
     * @return 查询结果
     */
    Wrapper<WorkflowTaskListBO> getMemberProcessSteps(MemberRelationDO relationDO);

    /**
     * 根据创建下级会员的规则，查询下级会员的角色列表
     * @param memberTypeEnum 上级会员的会员类型枚举
     * @return 查询结果
     */
    List<RoleIdAndNameVO> getSubRoleList(Integer memberTypeEnum);

    /**
     * 根据创建下级会员的规则，查询下级会员的角色列表(SAAS)
     *
     * @param memberTypeEnum   上级会员的会员类型枚举
     * @param roleManageVOList 会员适用角色list
     * @return 查询结果
     */
    List<RoleIdAndNameVO> getSubRoleList(Integer memberTypeEnum, List<RoleRuleManageVO> roleManageVOList);

    /**
     * 根据上级会员Id，查询代理省列表
     * @param upperRelationId 上级会员关系Id
     * @return 返回信息
     */
    Wrapper<List<CountryAreaCodeNameVO>> getProvinceList(Long upperRelationId);

    /**
     * 根据上级会员Id和省编码，查询代理市列表
     * @param upperRelationId 上级会员Id
     * @param provinceCode 省编码
     * @return 返回信息
     */
    Wrapper<List<CountryAreaCodeNameVO>> getCityList(Long upperRelationId, String provinceCode);

    /**
     * 查询渠道类型列表
     * @return 查询结果
     */
    List<ChannelTypeIdAndNameVO> getChannelTypes();

    /**
     * 查询上级会员关系和名称列表
     * @param subMemberId 下级会员Id
     * @param subRoleId 下级会员角色Id
     * @return 查询结果
     */
    List<UpperRelationIdAndNameVO> getUpperRelationList(Long subMemberId, Long subRoleId);

    /**
     * 新增角色时，根据会员类型，查询角色列表
     * @param memberTypeId 会员类型Id
     * @return 查询结果
     */
    List<RoleIdAndNameVO> getRoleListByMemberType(Long memberTypeId);

    /**
     * 检查并生成新的渠道信息（用于新增下级会员）
     * @param upperRelationId 上级会员关系Id
     * @param subMemberId 当前会员Id
     * @param subRoleId   当前会员角色Id
     * @param channelTypeId 渠道类型Id
     * @param areas  代理区域
     * @param remark 备注信息
     * @return 操作结果
     */
    Wrapper<MemberChannelDO> checkChannelAgentAreas(Long upperRelationId, Long subMemberId, Long subRoleId, Long channelTypeId, List<AreaCodeVO> areas, String remark);

    /**
     * 检查并修改渠道信息（用于修改下级会员）
     * @param relationDO 会员关系
     * @param upperRelationId 上级会员关系Id
     * @param subMemberId 当前会员Id
     * @param subRoleId   当前会员角色Id
     * @param channelTypeId 渠道类型Id
     * @param areas  代理区域
     * @param remark 备注信息
     * @return 操作结果
     */
    Wrapper<Void> updateChannelAgentAreas(MemberRelationDO relationDO,  Long upperRelationId, Long subMemberId, Long subRoleId, Long channelTypeId, List<AreaCodeVO> areas, String remark);


    /**
     * 根据上级会员Id检查代理区域，并更新relationDo关联的MemberChannelDO中的信息（未保存，调用方需要保存relationDO）
     * @param relationDO 会员关系
     * @param upperRelationId 上级会员关系Id
     * @param channelTypeId 渠道类型Id
     * @param areas 代理区域
     * @param remark 渠道备注信息
     * @return 检查结果
     */
    Wrapper<Void> checkAndUpdateChannelAgentAreas(MemberRelationDO relationDO, Long upperRelationId, Long channelTypeId, List<AreaCodeVO> areas, String remark);

    /**
     * 批量入库、资料审核
     * @param loginUser 登录用户
     * @param validateIds 审核内容Id列表
     * @param innerStatusEnum 匹配的内部状态
     * @return 审核结果
     */
    Wrapper<Void> batchExecMemberProcess(UserLoginCacheDTO loginUser, List<Long> validateIds, MemberInnerStatusEnum innerStatusEnum);

    /**
     * 批量入库、资料审核
     * @param loginUser 登录用户
     * @param validateIds 审核内容Id列表
     * @param innerStatusEnums 匹配的内部状态列表
     * @return 审核结果
     */
    Wrapper<Void> batchExecMemberProcess(UserLoginCacheDTO loginUser, List<Long> validateIds, List<MemberInnerStatusEnum> innerStatusEnums);

    /**
     * 执行入库、资料变更流程
     * @param loginUser 登录用户
     * @param validateId 会员关系Id
     * @param agree  审核结果 0-不通过， 1-通过
     * @param reason 审核意见
     * @param innerStatusEnum 匹配的内部状态
     * @return 执行结果
     */
    Wrapper<Void> execMemberProcess(UserLoginCacheDTO loginUser, Long validateId, Integer agree, String reason, MemberInnerStatusEnum innerStatusEnum);

    /**
     * 执行入库、资料变更流程
     * @param loginUser 登录用户
     * @param validateId 会员关系Id
     * @param agree  审核结果 0-不通过， 1-通过
     * @param reason 审核意见
     * @param innerStatusEnums 匹配的内部状态列表
     * @return 执行结果
     */
    Wrapper<Void> execMemberProcess(UserLoginCacheDTO loginUser, Long validateId, Integer agree, String reason, List<MemberInnerStatusEnum> innerStatusEnums);

    /**
     * 执行入库、资料变更流程
     * @param loginUser 登录用户
     * @param relationDO 会员关系
     * @param agree    审核结果 0-不通过， 1-通过
     * @param reason   不通过的原因
     * @param innerStatusEnum 匹配的内部状态
     * @return 执行结果
     */
    Wrapper<Void> execMemberProcess(UserLoginCacheDTO loginUser, MemberRelationDO relationDO, Integer agree, String reason, MemberInnerStatusEnum innerStatusEnum);

    /**
     * 执行入库、资料变更流程
     * @param loginUser 登录用户
     * @param relationDO 会员关系
     * @param agree    审核结果 0-不通过， 1-通过
     * @param reason   不通过的原因
     * @param innerStatusEnums 匹配的内部状态列表
     * @return 执行结果
     */
    Wrapper<Void> execMemberProcess(UserLoginCacheDTO loginUser, MemberRelationDO relationDO, Integer agree, String reason, List<MemberInnerStatusEnum> innerStatusEnums);
}
